﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Sistema_Totem.Acceso_a_Datos.IDAOS;
using Sistema_Totem.Clases;
using System.Data.SqlClient;
using System.Data;
using Sistema_Totem.Clases.Fabricas;
using Sistema_Totem.Exepciones;

namespace Sistema_Totem.Acceso_a_Datos.DAOS
{
    public class DAOUsuario : DAOSQLServer, iDAOUsuario
    {
        #region Grupo Login y Proyecto

        #region Atributos

        private Conexion _conexion = new Conexion();
        private SqlCommand _comando = new SqlCommand();
        private SqlDataReader _lectorConsulta = null;
        private Entidad _usuario = null;

        #endregion Atributos

        #region Métodos

        #region ConsultarUsuarioPorID

        /// <summary>
        /// Dado el id de un usuario se realiza búsqueda en BD para obtener formar el objeto
        /// usuario y posteriormente retornarlo
        /// </summary>
        /// <param name="_idUsuario">ID del usuario</param>
        /// <returns>Entidad Usuario</returns>
        
        public Entidad ConsultarUsuarioPorID(int _idUsuario)
        {                       
            try
            {
                _conexion.AbrirConexionBd();

                _comando.Connection = _conexion.ObjetoConexion();

                _comando.CommandType = CommandType.StoredProcedure;
                
                _comando.CommandText = "[dbo].[ObtenerUsuarioCompleto]";

                _comando.Parameters.AddWithValue("@idUsuario", _idUsuario);
                _comando.CommandTimeout = 10;

                _lectorConsulta = _comando.ExecuteReader();

                while (_lectorConsulta.Read())
                {
                    _usuario = FabricaEntidad.CrearUsuario();
                    (_usuario as Usuario).UserId = _lectorConsulta.GetDecimal(4).ToString();
                    (_usuario as Usuario).Nombre = _lectorConsulta.GetString(2);
                    (_usuario as Usuario).Telefono = _lectorConsulta.GetString(5);
                    (_usuario as Usuario).Correo = _lectorConsulta.GetString(1);
                    (_usuario as Usuario).Username = _lectorConsulta.GetString(6);
                    (_usuario as Usuario).Password = _lectorConsulta.GetString(3);
                    (_usuario as Usuario).TipoUsuario = _lectorConsulta.GetString(0);

                }

                _lectorConsulta.Close();

            }
            catch (SqlException)
            {
                throw new ErrorConexionException();
            }
            finally
            {
                _conexion.CerrarConexionBd();
            }

            return _usuario; 
        }

        #endregion ConsultarUsuarioPorID

        #region ConsultarUsuarioPorUsername

        /// <summary>
        /// Para recuperar contraseña es necesario enviar el username del usuario
        /// se busca en BD, si el resultado es correcto se envia el objeto completo (Usuario)
        /// </summary>
        /// <param name="_username">Username del usuario</param>
        /// <returns>Entidad Usuario</returns>
        
        public Entidad ConsultarUsuarioPorUsername(string _username)
        {
            try
            {
                _conexion.AbrirConexionBd();

                _comando.Connection = _conexion.ObjetoConexion();

                _comando.CommandType = CommandType.StoredProcedure;

                _comando.CommandText = "[dbo].[RecuperarContrasenaUsuario]";

                _comando.Parameters.AddWithValue("@userName", _username);
                _comando.CommandTimeout = 10;

                _lectorConsulta = _comando.ExecuteReader();

                while (_lectorConsulta.Read())
                {
                    _usuario = FabricaEntidad.CrearUsuario();
                    (_usuario as Usuario).UserId = _lectorConsulta.GetDecimal(0).ToString();
                    (_usuario as Usuario).Nombre = _lectorConsulta.GetString(1);
                    (_usuario as Usuario).Telefono = _lectorConsulta.GetString(2);
                    (_usuario as Usuario).Correo = _lectorConsulta.GetString(3);
                    (_usuario as Usuario).Username = _lectorConsulta.GetString(4);
                    (_usuario as Usuario).Password = _lectorConsulta.GetString(5);
                }

                _lectorConsulta.Close();

            }
            catch (SqlException)
            {
                throw new ErrorConexionException();
            }
            finally
            {
                _conexion.CerrarConexionBd();
            }

            return _usuario;
        }

        #endregion ConsultarUsuarioPorUsername

        #region ModificarPassword

        /// <summary>
        /// Dado el username y el password de un usuario, se realiza la busqueda
        /// en BD, y se actualiza dicho registro
        /// </summary>
        /// <param name="_username">Username del usuario</param>
        /// <param name="_newPassword">Clave nueva del usuario</param>
        /// <returns>true = Registro Actualizado</returns>
        /// <returns>false = Caída en alguna Excepcion</returns>

        public bool ModificarPassword(string _username, string _newPassword)
        {
            try
            {

                _conexion.AbrirConexionBd();

                _comando.Connection = _conexion.ObjetoConexion();

                _comando.CommandType = CommandType.StoredProcedure;

                _comando.CommandText = "[dbo].[ModificarPasswordUsuario]";

                _comando.Parameters.AddWithValue("@Username", _username);
                _comando.Parameters.AddWithValue("@passwordNueva", _newPassword);
                _comando.CommandTimeout = 10;

                 _comando.ExecuteReader();

                 return true;

            }
            catch (SqlException)
            {
                throw new ErrorConexionException();
            }
            finally
            {
                _conexion.CerrarConexionBd();
            }
            
        }

        #endregion ModificarPassword

        #region ConsultarValidarUsuario

        /// <summary>
        /// Método que valida existencia de un usuario en la BD
        /// Usando de puente ConsultarIdUsuario para realizar dicha validacion
        /// </summary>
        /// <param name="_username">Username del usuario</param>
        /// <param name="_password">Password del usuario</param>
        /// <returns>true = Si el id es distinto de cero (Asumiendo que en BD no existe un id 0)</returns>
        /// <returns>false = Si el id es igual a cero (Misma argumentacion parte superior)</returns>

        public bool ConsultarValidarUsuario(string _username, string _password)
        {
            if (ConsultarIdUsuario(_username, _password) != 0)
                return true;
            else return false;
        }

        #endregion ConsultarValidarUsuario
         
        #region ConsultarIdUsuario

        /// <summary>
        /// Método que obtiene el id del usuario en BD
        /// </summary>
        /// <param name="_username">Username del usuario</param>
        /// <param name="_userPassword">Password del usuario</param>
        /// <returns>Id del usuario hallado en BD</returns>
        
        public int ConsultarIdUsuario(string _username, string _userPassword)
        {            
            int _idUsuario = 0;

            try
            {

                _conexion.AbrirConexionBd();

                _comando.Connection = _conexion.ObjetoConexion();

                _comando.CommandType = CommandType.StoredProcedure;

                _comando.CommandText = "[dbo].[ObtenerIdUsuarioConectado]";

                _comando.Parameters.AddWithValue("@Usuario",_username);
                _comando.Parameters.AddWithValue("@Password",_userPassword);
                _comando.CommandTimeout = 10;

                _lectorConsulta = _comando.ExecuteReader();
                
                while (_lectorConsulta.Read())

                    _idUsuario = Convert.ToInt32(_lectorConsulta.GetDecimal(0));

                _lectorConsulta.Close();

            }
            catch (SqlException)
            {
                throw new ErrorConexionException();
            }
            finally
            {                
                _conexion.CerrarConexionBd();
            }

            return _idUsuario;
        }

        #endregion ConsultarIdUsuario

        #endregion Métodos

        #endregion Grupo Login y Proyecto
    }
}